﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using WsProtocol.PublicClass;
using Wasion.HHU.Data.Repositories;
using Wasion.HHU.Data.Models;

namespace WsProtocol.IEC62056MDL
{
    //接口类定义
    public class ProIClass : ProNodeBase
    {        
        private static TIClassDbRepository vomSrv = new TIClassDbRepository();
        private static string ptltable = "T_IClass";
        private static DataTable dtAll = null;  //所有数据
        public static List<ProIClass> IClasslst; //接口类内存表
        public List<ProICAttrMth> Attrlst = new List<ProICAttrMth>();  //属性或方法列表
        public string ClassID { get; set; }
        public string ClassName { get; set; }
        public string IsVisible { get; set; }
        public string Version { get; set; }
        public string ClassIDVersion
        {
            get
            {
                if (string.IsNullOrEmpty(ClassID))
                    return string.Empty;
                else
                {
                    if (!string.IsNullOrEmpty(Version))
                    {
                        if (Version.IndexOf(":") < 0)
                            return ClassID + ":" + Version;
                        else
                            return Version;
                    }
                    else
                        return ClassID;
                }
            }
        }
        public ProIClass()
        {
            Attrlst = new List<ProICAttrMth>();
            ClassID = ClassName = string.Empty;
            Version = "0";
            IsVisible = "1";    
        }

        protected override void Dispose(bool disposing)
        {
            IClasslst.Remove(this);
        }

        //private static List<ProIClass> TableToList(DataTable dt)
        //{
        //    List<ProIClass> list = new List<ProIClass>();
        //    ProIClass m = null;
        //    foreach (DataRow dr in dt.Rows)
        //    {
        //        m = new ProIClass();

        //        m.ID = dr["ID"].ToString();
        //        m.ClassID = dr["ClassID"].ToString();
        //        m.ClassName = dr["ClassName"].ToString();
        //        m.IsVisible = dr["IsVisible"].ToString();
        //        if (dr.Table.Columns.Contains("Version") && !string.IsNullOrEmpty(dr["Version"].ToString()))
        //            m.Version = dr["Version"].ToString();
        //        m.Attrlst = ProICAttrMth.GetAttrByICID(m);

        //        list.Add(m);
        //    }
        //    return list;
        //}

        //获取数据库中的所有类
        public static List<ProIClass> GetAllIClass(bool visible)
        {
            //PtlConsts.easyDb.Clear();
            //PtlConsts.easyDb.TableName = ptltable;
            //if (visible)
            //    PtlConsts.easyDb.SetWhereParameter(true, "IsVisible", "=", "1", EasyDataType.String);
            //PtlConsts.easyDb.SetOrder("ClassID");
            //dtAll = PtlConsts.easyDb.Select();
            //dtAll.TableName = ptltable;

            ////先获取所有属性
            //// ProICAttrMth.GetAllAttr();

            //IClasslst = ProIClass.TableToList(dtAll);

            
            var vomList = vomSrv.GetAllList(visible).Result;
            IClasslst = ToProIClassList(vomList);

            return IClasslst;
        }

        private static List<ProIClass> ToProIClassList(List<TIClass> iclasss)
        {
            List<ProIClass> list = new List<ProIClass>();
            ProIClass pic = null;
            foreach (TIClass ic in iclasss)
            {
                pic = new ProIClass();

                pic.ID = ic.ID;
                pic.ClassID = ic.ClassID.ToString();
                pic.ClassName = ic.ClassName;
                pic.IsVisible = ic.Isvisible.ToString();
                if (!string.IsNullOrEmpty(ic.Version.ToString()))
                {
                    pic.Version = ic.Version.ToString();
                }
                pic.Attrlst = ProICAttrMth.GetAttrByICID(pic);

                list.Add(pic);
            }
            return list;
        }

        /// <summary>
        /// 获取所有数据的集合
        /// </summary>
        /// <returns></returns>
        //public static DataTable GetIClassDateTable()
        //{
        //    if (dtAll == null)
        //        GetAllIClass(false);
        //    return dtAll;
        //}

        //根据ID查找对应的接口类
        public static ProIClass GetClassByID(string id, string version)
        {
            ProIClass proIClass = new ProIClass();
            //hxh 19-7-8 如果没在类中找到则把对象中的信息赋过来, 抄15类有些对象类及版本号数据库中可能未加
            if (string.IsNullOrEmpty(id))
            {
                if (string.IsNullOrEmpty(version))
                    return proIClass;
                string[] conlst = version.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                proIClass.ClassID = conlst[0];
                if (conlst.Length > 1)
                    proIClass.Version = conlst[1];
                return proIClass;
            }

            if (IClasslst == null)
                GetAllIClass(false);

            for (int i = 0; i < IClasslst.Count; i++)
            {
                if (IClasslst[i].ID == id)
                {
                    proIClass = IClasslst[i];
                    break;
                }

            }
            return proIClass;
        }

        //hxh 19-7-8 根据ID及版本查找对应的接口类
        //public static ProIClass GetByClassIDVersion(string classid, string version)
        //{
        //    ProIClass proIClass = new ProIClass();
        //    proIClass.ClassID = classid;

        //    proIClass.Version = classid + ":" + version;
        //    if (IClasslst == null)
        //        GetAllIClass(false);

        //    for (int i = 0; i < IClasslst.Count; i++)
        //    {
        //        if (IClasslst[i].ClassID == classid &&
        //            IClasslst[i].Version == version)
        //        {
        //            proIClass = IClasslst[i];
        //            break;
        //        }

        //    }
        //    return proIClass;
        //}

        //根据ClassID和版本号查找对应的接口类
        //public static ProIClass GetClassByClassID(string classid)
        //{
        //    ProIClass proIClass = new ProIClass();
        //    if (string.IsNullOrEmpty(classid))
        //        return proIClass;

        //    if (IClasslst == null)
        //        GetAllIClass(false);

        //    string[] conlst = classid.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
        //    for (int i = 0; i < IClasslst.Count; i++)
        //    {
        //        if (IClasslst[i].ClassID == conlst[0])
        //        {
        //            if (conlst.Length > 1)
        //            {
        //                if (IClasslst[i].Version == conlst[1])
        //                {
        //                    proIClass = IClasslst[i];
        //                    break;
        //                }
        //            }
        //            else
        //            {
        //                proIClass = IClasslst[i];
        //                break;
        //            }
        //        }

        //    }
        //    return proIClass;
        //}


        /// <summary>
        /// 检查类编号是否重复
        /// </summary>
        /// <param name="aid"></param>
        /// <returns></returns>
        //public bool CheckRepeat()
        //{
        //    PtlConsts.easyDb.Clear();
        //    PtlConsts.easyDb.TableName = ptltable;
        //    PtlConsts.easyDb.SetWhereParameter(true, "ClassID", "=", ClassID, EasyDataType.String);
        //    PtlConsts.easyDb.SetWhereParameter(true, "Version", "=", Version, EasyDataType.String);
        //    DataTable dt = PtlConsts.easyDb.Select();
        //    return dt != null && dt.Rows.Count > 0;
        //}

        //获取某个Class包含的属性及方法
        //public void GetAttrByICID()
        //{
        //    Attrlst.Clear();
        //    Attrlst = ProICAttrMth.GetAttrByICID(this);
        //}

        //public int DeleteIClassByID(ref string errinfo)
        //{
        //    if (string.IsNullOrEmpty(ID)) return 1;
        //    try
        //    {
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable;
        //        PtlConsts.easyDb.SetWhereParameter(true, "ID", "=", ID, EasyDataType.String);
        //        int rs = PtlConsts.easyDb.Delete(ref errinfo);
        //        if (rs >= 0)
        //            this.Dispose();
        //        return rs;
        //    }
        //    catch
        //    {
        //        return -1;
        //    }
        //}


        //public int DeleteIClassByClassID(ref string errinfo)
        //{
        //    if (string.IsNullOrEmpty(ClassID)) return 1;
        //    try
        //    {
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable;
        //        PtlConsts.easyDb.SetWhereParameter(true, "ID", "=", ID, EasyDataType.String);
        //        int rs = PtlConsts.easyDb.Delete(ref errinfo);
        //        if (rs >= 0)
        //            this.Dispose();
        //        return rs;
        //    }
        //    catch
        //    {
        //        return -1;
        //    }
        //}

        /// <summary>
        /// 保存一个接口类
        /// </summary>
        /// <param name="insertFlag">true时是插入增加,false更新</param>
        /// <returns></returns>
        //public int SaveIClass(bool insertFlag, ref string errinfo)
        //{
        //    PtlConsts.easyDb.Clear();
        //    PtlConsts.easyDb.TableName = ptltable;
        //    PtlConsts.easyDb.SetFieldValue("ClassID", ClassID, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("ClassName", ClassName, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("IsVisible", IsVisible, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("Version", Version, EasyDataType.String);
        //    if (insertFlag)
        //    {
        //        ID = Guid.NewGuid().ToString();
        //        PtlConsts.easyDb.SetFieldValue("ID", ID, EasyDataType.String);
        //        return PtlConsts.easyDb.Insert(ref errinfo);
        //    }
        //    else
        //    {
        //        PtlConsts.easyDb.SetWhereParameter(true, "ID", "=", ID, EasyDataType.String);
        //        return PtlConsts.easyDb.Update(ref errinfo);
        //    }
        //}
    }
}
    
